/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.activity;

import ade.prime.activity.parameters.ScheduleName;
import ade.prime.activity.parameters.ScheduleProject;
import ade.prime.model.Project;
import ade.prime.model.Resource;
import ade.prime.model.Schedule;
import ade.prime.service.AdeWebServiceListener;
import ade.prime.service.ScheduleUpdateProgress;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.Toast;

/**
 * Vue affichant le formulaire pour modifier un emploi du temps.
 * 
 * @author Zanette Sébastien, @author Andrianjafintrimo Victor
 */
public class EditSchedule extends CreateSchedule
implements BundleExtraNames {
	
	@SuppressWarnings("hiding")
	protected static final String TAG = EditSchedule.class.getSimpleName() ;

	/**
	 * Emploi du temps original de l'emploi du temps à modifier.
	 */
	protected Schedule originalS ;
	
	/**
	 * Rajoute cette activité dans la liste des écouteurs du service.
	 */
	@Override
	protected void onRestart() {
		super.onRestart() ;
		try {
			int id = this.serviceApi.addListener(this.listener) ;
			this.listener.setId(id) ;
		} catch (RemoteException e) {
			Log.e(TAG, "Failed to add listener", e); //$NON-NLS-1$
		}// try
	}// onRestart()
	
	/**
	 * Supprime cette activité de la liste des écouteurs du service.
	 */
	@Override
	protected void onStop() {
		super.onStop() ;
		try {
			this.serviceApi.removeListener(this.listener) ;
		} catch (RemoteException re) {
			// TODO: handle exception
			Log.d(TAG, "Failed to unbind from the service", re) ; //$NON-NLS-1$
		}// try
	}// onStop()

	@Override
	protected AdeWebServiceListener getAdeWebServiceListener() {
		return new AdeWebServiceListenerAdapter(this) ;
	}// getAdeWebServiceListener()

	/**
	 * Initialise les champs de la liste avec les valeurs de l'emploi du temps à modifier.
	 */
	@Override
	public void init() { 
		Bundle args = this.getIntent().getExtras() ;
		this.originalS = args.getParcelable(EXTRA_SCHEDULE) ;

		String ressources = this.originalS.getResources();
		if (this.originalS.getStudentNum().length()>0 && !ressources.equals("")) //$NON-NLS-1$
			ressources = ressources+"|"+this.originalS.getStudentNum(); //$NON-NLS-1$
		else if (this.originalS.getStudentNum().length()>0 && ressources.equals("")) //$NON-NLS-1$
			ressources = this.originalS.getStudentNum();

		this.init(this.originalS.getName(),
				ressources, 
				Integer.valueOf(this.originalS.getPeriod()), 
				this.originalS.getProject()) ;
	}// init()

	/**
	 * Retourne une instance de {@code OnClickListener} pour l'enregistrement.
	 * 
	 * @return	instance de {@code OnClickListener} pour l'enregistrement
	 */
	@Override
	protected OnClickListener getSaveListener() {
		return new SaveListener(this) ;
	}// getSaveListener()

	/**
	 * OnClickListener pour le bouton "enregistrer".
	 * 
	 * <p>Retrouve la donnée depuis le formulaire et insère l'emploi du temps dans la base de données si possible.</p>
	 * 
	 * @author  Zanette Sébastien, Andrianjafintrimo Victor
	 */
	class SaveListener implements OnClickListener {
		
		private final String mTAG = SaveListener.class.getSimpleName() ;

		/**
		 * Vue contenant le composant attaché à l'écouteur.
		 */
		protected EditSchedule container ;

		/**
		 * Constructeur. 
		 * 
		 * @param 	container vue qui content le composant attaché à l'écouteur
		 */
		public SaveListener(EditSchedule container) {
			super();
			this.container = container;
		}// SaveListener(EditScheduleScreen)

		/**
		 * Définition des actions du clique sur le composant attaché.
		 * 
		 * @param	actualView vue du composat qui à reçu un click event
		 */
		@Override
		public void onClick(View view) {
			LinearLayout actualView = this.container.getFields() ;
			// Retrieve form data
			String name = this.container.getById(ScheduleName.FIELD_ID)
					.getValue(actualView).toString() ;
			int nResources = this.container.newResIndex - 2 ;
			Resource[] resources = new Resource[nResources] ;
			for(int r=0; r < nResources; ++r) {
				String resource = (String) this.container.params.get(r+2)
						.getValue(actualView.getChildAt(r+2)) ;
				resources[r] = new Resource(resource) ;
			}// for
			int period = ((Integer) this.container.getById(PARAMETER_PERIOD)
					.getValue(actualView)).intValue() ;
			Project project = (Project) this.container.getById(ScheduleProject.FIELD_ID)
					.getValue(actualView) ;
			
			try {
//				Log.d(this.mTAG, "Editing schedule, values:") ; //$NON-NLS-1$
//				Log.d(this.mTAG, "-- name:" + name) ; //$NON-NLS-1$
//				Log.d(this.mTAG, "-- resources:" + Arrays.toString(resources)) ; //$NON-NLS-1$
//				Log.d(this.mTAG, "-- period:" + period) ; //$NON-NLS-1$
//				Log.d(this.mTAG, "-- project:" + project) ; //$NON-NLS-1$
				Schedule result = this.container.serviceApi
					.editSchedule(this.container.getOriginalSchedule(),
							name, resources, period, project) ;
//				Log.d(this.mTAG, "Schedule: " + result) ; //$NON-NLS-1$
				if (result != null) {
					this.container.onBackPressed() ;
				} else {
					Toast.makeText(this.container, 
							"Echec de la modification de l'emploi du temps.",  //$NON-NLS-1$
							Toast.LENGTH_SHORT).show() ;
				}// if
			} catch (RemoteException re) {
				// TODO Handle exception
				Log.d(this.mTAG, "Failed to modify schedule", re) ; //$NON-NLS-1$
			}// try
		}// onClick(View)  

	}// class SaveListener

	/**
	 * Retourne l'emploi du temps original de l'emploi du temps à modifier.
	 * @return  {@code Schedule}
	 */
	public Schedule getOriginalSchedule() {
		return this.originalS;
	}// getOriginalSchedule()
	
	private class AdeWebServiceListenerAdapter 
	extends AdeWebActivity.AdeWebServiceListenerAdapter {
		
		protected AdeWebServiceListenerAdapter(EditSchedule activity) {
			super(activity) ;
		}// AdeWebServiceListenerAdapter(EditSchedule)
		
		/**
		 * {@inheritDoc}
		 */
		@Override
		protected void handleModifiedScheduleStateRunnable(
				Schedule modifiedSchedule, ScheduleUpdateProgress newUpdateState) {
			EditSchedule es = (EditSchedule) this.activity ;
			Log.d(TAG, "[handleModifiedScheduleStateRunnable]") ; //$NON-NLS-1$
			if (es.originalS.getId() == modifiedSchedule.getId()) {
				switch(modifiedSchedule.getState()) {
				case WAITING_FOR_UPDATE:
					Toast.makeText(this.activity, 
							R.string.EditSchedule_warning_schedule_update, 
							Toast.LENGTH_LONG).show() ;
					break ;
				case UPDATING:
					Toast.makeText(this.activity, 
							R.string.EditSchedule_schedule_locked, 
							Toast.LENGTH_LONG).show() ;
					this.activity.onBackPressed() ;
					break ;
				default:
					// Nothing to be done.
				}// switch
			}// if
		}// handleModifiedScheduleStateRunnable(Schedule)
		
	}// class AdeWebServiceListenerAdapter

}// class EditScheduleScreen
